home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
ciarnv85.arc
/
H2.4TH
< prev
next >
Wrap
Text File
|
1986-04-08
|
18KB
|
413 lines
HEX
CTAG
( If HEXR is ON, all data characters received by the HOST computer will be )
( displayed as 2 hex digits followed by 2 blanks. If DECR is ON each data )
( byte is displayed as 3 decimal digits and 1 blank. If CHARR is ON then )
( each byte will be displayed as printable character preceded by either a )
( . if the hi bit is off, or a : if the hi bit is on. If it is not a print-)
( able character it will be displayed as 2 hex digits and 2 blanks. )
DI
: 11/100_SEC 1100 0 DO LOOP ; ( This just waits .11 sec. )
HEX
( HELP prints the help menu for the HOST terminal emulator. )
: HELP CR CR CR CR CR CR
CR ." XECOM TERMINAL EMULATOR 2.00 "
CR
CR ." FUNCTION -KEY- SHIFTED FUNCTION "
CR ." ---------------- ----- ------------------"
CR
CR ." HELP SCREEN F1 END EMULATION "
CR ." CLEAR ERROR FLAGS F2 RUN INTERPRETER "
CR ." ECHO RECEIVER F3 TOGGLE DTR "
CR ." SEND FUNCTIONS F4 SEND DATA"
CR ." SET NEW MODE F5 SET NEW CONTROL BYTE"
CR ." STATUS ON F6 STATUS OFF"
CR ." EXECUTE MACRO F7 DEFINE MACRO"
CR ." LINE ANALYSIS F8 1200 BPS ANALYSIS"
CR ." RECEIVER FORMAT F9 CHARACTER SET TRANSMIT"
CR ." DTMF/SYNTH TEST F10 AUTOMATIC ANSWER"
CR CR CR CR ;
( ?AUT IS TO STOP AUTO ANSWER STUFF )
: ?AUT ?TERM ABORT" AUTO ANSWER STOPPED. " ;
( $QUERY accepts a string terminated by <CR> from the terminal and shifts )
( it one char to the right, preceding it with a '$' character, and places )
( it in the TIB which is FORTH's Terminal Input Buffer. This allows the user )
( to input a string which will be guaranteed to be unique from any other )
( FORTH words. )
: $QUERY QUERY TIB @ DUP 1+ 4F <CMOVE 24 ( $ ) TIB @ C! ;
( CMD! accepts a data byte and bangs it into the data port if the XR bit of )
( the status register is on, othrwise a message is printed. )
: CMD! 400 0
DO CT@ XR AND IF DA! LEAVE THEN I 3FF =
IF DROP ." NOT READY " THEN LOOP ;
( FETCH waits for RR then fetches the status byte again and leaves a flag )
( indicating whether DSR is on. It can be stopped by striking any key. )
CREATE CFLAG 0 ,
: FETCH BEGIN ?KEY CT@ RR AND UNTIL CT@ DSR AND ;
: MESS DA@ DUP 42 =
IF ." " BLINK ." BUSY " NORM QUIT
ELSE DUP 56 =
IF ." " BLINK ." VOICE " NORM QUIT
ELSE DUP 44 =
IF ." " BLINK ." DIAL TONE " NORM QUIT
ELSE DUP 46 =
IF ." " BLINK ." CONNECTION FAILED "
NORM QUIT
ELSE DUP 52 =
IF ." " BLINK ." RINGING " NORM
CR 0 CFLAG !
ELSE DUP 54 =
IF ." " BLINK ." TIMED OUT " NORM
CR 0 CFLAG !
ELSE DROP ." LAST MEASUREMENTS WERE "
THEN
THEN
THEN
THEN
THEN
THEN ;
( BBLINE simply prints a blank line with sides of a box. )
: BBLINE 4 SPACES BA EMIT 40 0 DO 20 EMIT LOOP BA EMIT CR ;
CREATE STATUS 0 , ( variable indicating whether the status line is on )
: KEYZ
( EXTENDED SCREEN & KEYBOARD CONTROL : )
( FUNCTION KEYS F1 - F20 ARE ASSIGNED ASCII CODES E1 - F4 HEX)
( F11 - F20 ARE SHIFTED FUNCTION KEYS )
( F1 ) 1B EMIT ." [0;59;225p"
( F2 ) 1B EMIT ." [0;60;226p"
( F3 ) 1B EMIT ." [0;61;227p"
( F4 ) 1B EMIT ." [0;62;228p"
( F5 ) 1B EMIT ." [0;63;229p"
( F6 ) 1B EMIT ." [0;64;230p"
( F7 ) 1B EMIT ." [0;65;231p"
( F8 ) 1B EMIT ." [0;66;232p"
( F9 ) 1B EMIT ." [0;67;233p"
( F10) 1B EMIT ." [0;68;224p"
( S_F1 ) 1B EMIT ." [0;84;235p"
( S_F2 ) 1B EMIT ." [0;85;236p"
( S_F3 ) 1B EMIT ." [0;86;237p"
( S_F4 ) 1B EMIT ." [0;87;238p"
( S_F5 ) 1B EMIT ." [0;88;239p"
( S_F6 ) 1B EMIT ." [0;89;240p"
( S_F7 ) 1B EMIT ." [0;90;241p"
( S_F8 ) 1B EMIT ." [0;91;242p"
( S_F9 ) 1B EMIT ." [0;92;243p"
( S_F10) 1B EMIT ." [0;93;234p"
( CTRL/BREAK ) 1B EMIT ." [0;0;254p"
( ^C ) 1B EMIT ." [3;131p" ;
: KEYZM
( EXTENDED SCREEN & KEYBOARD CONTROL : )
( FUNCTION KEYS F1 - F20 ARE TEMPORARILY ASSIGNED ASCII CODES )
( CORRESPONDING TO f1 THRU f0 AND F1 THRU F0 ONLY DURING MACRO )
( DEFINITIONS. f means regular function keys. F means shifted func. keys.)
( F1 ) 1B EMIT ." [0;59;102;49p"
( F2 ) 1B EMIT ." [0;60;102;50p"
( F3 ) 1B EMIT ." [0;61;102;51p"
( F4 ) 1B EMIT ." [0;62;102;52p"
( F5 ) 1B EMIT ." [0;63;102;53p"
( F6 ) 1B EMIT ." [0;64;102;54p"
( F7 ) 1B EMIT ." [0;65;102;55p"
( F8 ) 1B EMIT ." [0;66;102;56p"
( F9 ) 1B EMIT ." [0;67;102;57p"
( F10) 1B EMIT ." [0;68;102;48p"
( S_F1 ) 1B EMIT ." [0;84;70;49p"
( S_F2 ) 1B EMIT ." [0;85;70;50p"
( S_F3 ) 1B EMIT ." [0;86;70;51p"
( S_F4 ) 1B EMIT ." [0;87;70;52p"
( S_F5 ) 1B EMIT ." [0;88;70;53p"
( S_F6 ) 1B EMIT ." [0;89;70;54p"
( S_F7 ) 1B EMIT ." [0;90;70;55p"
( S_F8 ) 1B EMIT ." [0;91;70;56p"
( S_F9 ) 1B EMIT ." [0;92;70;57p"
( S_F10) 1B EMIT ." [0;93;70;48p" ;
CREATE ECHOFLAG 0 ,
( The following words are the routines to be executed by the function keys. )
( Their functions are desribed in the help menu. )
: FK1 HELP ;
: FK2 CTL C@ ER OR CT! ;
: FK3 ECHOFLAG @ 1 XOR ECHOFLAG ! CR ECHOFLAG @ IF ." ECHO MODE ON " ELSE ." ECHO MODE OFF " THEN ; ( TOGGLE ECHO RECEIVER FLAG )
: FK4 CTL C@ [ RTS FF XOR ] LITERAL AND CTL! ; ( FUNCTION MODE )
: FK5 MODE ;
: FK6 STATUS ON ;
: FK7 ." MACRO NAME? " $QUERY -FIND IF DROP @ COMPTR ! 0
ELSE ." MACRO NOT FOUND " THEN CR ;
: LBOX CR 4 SPACES C9 EMIT 40 0 DO CD EMIT LOOP BB EMIT CR
BBLINE 4 SPACES BA EMIT FREQ_DEV 9 SPACES BA EMIT CR
BBLINE 4 SPACES BA EMIT S/N_DB 9 SPACES BA EMIT CR
BBLINE 4 SPACES BA EMIT SIG_LEV 9 SPACES BA EMIT CR
BBLINE 4 SPACES C8 EMIT 40 0 DO CD EMIT LOOP BC EMIT CR ;
CREATE PHITS 0 , ( PHASE HITS )
CREATE AVPHE 0 , ( AVERAGE PHASE ERROR )
: LBOX2 CR 4 SPACES C9 EMIT 40 0 DO CD EMIT LOOP BB EMIT CR
BBLINE 4 SPACES BA EMIT ." AVERAGE PHASE ERROR IS " AVPHE @ 0 4 DI D.R HEX ." DEGREES " 17 SPACES BA EMIT CR
BBLINE 4 SPACES BA EMIT ." NUMBER OF PHASE HITS SINCE LAST MEASUREMENT IS " PHITS @ 0 4 DI D.R HEX 9 SPACES BA EMIT CR
BBLINE 4 SPACES C8 EMIT 40 0 DO CD EMIT LOOP BC EMIT CR ;
: LDGET FETCH
IF DA@ DEV !
ELSE MESS EXIT
THEN FETCH
IF DA@ LEV !
ELSE MESS EXIT
THEN FETCH
IF DA@ NN !
ELSE MESS EXIT
THEN ;
: S_F4 CTL C@ RTS OR CTL! ; ( DATA MODE )
: FK8 BEGIN FK4 1 CFLAG ! 4C CMD! 504C CIO ST1
LDGET CFLAG @ UNTIL LBOX
BEGIN ?KEY CT@ XR AND UNTIL S_F4 CR ." DATA MODE " ;
: FK9 CR ." RECEIVER FORMAT (H)ex/(D)ecimal/(M)onitor/(C)haracter? "
CHARR OFF HEXR OFF DECR OFF SKEY 20 OR DUP EMIT DUP 64 =
IF DECR ON THEN DUP 68 =
IF HEXR ON THEN DUP 6D =
IF CHARR ON THEN DROP CR ;
CREATE LASTKEY 0 ,
: FK10 ( VOICE/DTMF TEST )
FK4 44 XPT 16 XPT 58 XPT S_F4 ( Issue D and ^V funcs and go to data )
TRACE hello pause200 you_dialed a xecom modem
pause200 to_exit press*key two time _s CR
BEGIN RGT DUP EMIT DUP BL EMIT 3F =
IF im_sorry ELSE DUP 23 =
IF u press#key ELSE DUP 2A =
IF u press*key LASTKEY @ 2A = IF goodbye 05 CTL ! 05 CT! QUIT THEN
ELSE DUP DUP 30 < SWAP 39 > OR
IF ." BAD DIGIT RECEIVED: " DUP .
ELSE 30 - 2 * UNITS + @ you_dialed CFA EXECUTE
THEN
THEN
THEN
THEN DUP LASTKEY ! DROP CR
AGAIN ;
: S_F1 ." RETURN TO SYSTEM. ARE YOU SURE ? Y/N" CR
QUERY TIB @ C@ 20 OR 79 = IF BYE THEN CR ;
: S_F2 1 INTERP ! ." INTERPRETER ! "
BEGIN CR ST1 RP! QUERY INTERPRET STATE @ NOT IF ." OK" THEN AGAIN ;
: S_F3 CTL C@ DTR XOR CTL! ; ( TOGGLE DTR )
: S_F5 CR ST1 CTRL ;
: S_F6 STATUS OFF ;
: S_F7 KEYZM ." MACRO DEFINITION=" QUERY BL WORD DUP DUP C@ 1+ + 0
SWAP C! DUP C@ 2+ ALLOT CR
KEYZ ." MACRO NAME=" $QUERY 1+ CONSTANT ." OK " CR ;
: S_F8 FK4 1 CFLAG ! 6C CMD! 506C CIO ST1 FETCH
IF DA@ 5A * 100 / AVPHE !
ELSE 0 CFLAG ! DA@ 49 = IF ." INAPPROPRIATE: NO 1200 bps CONNECTION "
ELSE ." ??? "
THEN
THEN FETCH
IF DA@ PHITS !
ELSE 0 CFLAG ! DA@ 49 = IF ." INAPPROPRIATE "
ELSE ." ??? "
THEN
THEN CFLAG @
IF LBOX2 THEN ;
: S_F9 CR ." Transmitting character-set. Hit any key to stop." CR CSET ;
CREATE INFA 0 , ( INFORMATION BYTE FROM ^A )
: XWT2 BEGIN ?AUT RCV CT@ XR AND UNTIL ;
: S_F10 CR ." WAITING FOR RING " CR
0 INFA !
BEGIN ST1 ?AUT CT@ DET AND UNTIL
." RINGING DETECTED " CR FK4 01 XWT2 DA!
BEGIN ST1 ?AUT CT@ XR AND UNTIL
CT@ DUP RR AND
IF DSR AND 0=
IF DA@ INFA !
THEN DROP INFA @ DUP 31 = SWAP DUP 40 = OR
IF ." DTMF " FK10
ELSE DUP 76 =
IF ." VOICE " 44 XPT 16 XPT 58 XPT S_F4 QUIT
( if voice heard DTMF rcv, voice to line, audio out, data mode )
ELSE DUP 46 =
IF ." FAILED " QUIT
ELSE DUP 49 =
IF ." INAPPROPRIATE " QUIT
ELSE DUP 54 =
IF ." TIMED OUT " QUIT
THEN DROP
THEN
THEN
THEN
THEN
ELSE ." CONNECTED -- DATA MODE " S_F4 QUIT
THEN ;
: VCALCU FK4 44 XPT 16 XPT S_F4 ( Issue D and ^V functions and goto data )
VCALC ;
: C_BR ( CONTROL/BREAK ) 2A EMIT 2A EMIT
BEGIN ?KEY CT@ XE AND UNTIL
CTL @ SBR OR CTL! 11/100_SEC CTL @ [ SBR FF XOR ]
LITERAL AND CTL! ;
: NOOP ;
CTAG
( The following array is the addresses of the various function key functions )
( If a function key is hit when the HOST program is running, its function )
( address is placed in the variable COMPTR. )
CREATE CODARAY ' FK10 CFA , ' FK1 CFA , ' FK2 CFA , ' FK3 CFA ,
' FK4 CFA , ' FK5 CFA , ' FK6 CFA , ' FK7 CFA ,
' FK8 CFA , ' FK9 CFA , ' S_F10 CFA , ' S_F1 CFA ,
' S_F2 CFA , ' S_F3 CFA , ' S_F4 CFA , ' S_F5 CFA ,
' S_F6 CFA , ' S_F7 CFA , ' S_F8 CFA , ' S_F9 CFA ,
' NOOP CFA , ' NOOP CFA , ' NOOP CFA , ' NOOP CFA ,
' NOOP CFA , ' NOOP CFA , ' NOOP CFA , ' NOOP CFA ,
' NOOP CFA , ' NOOP CFA , ' C_BR CFA , ' NOOP CFA ,
CREATE STS 0 , ( variable in which to save status )
: XPUT BEGIN CT@ XR AND UNTIL DA! ;
( Now begins the HOST routine. It does some initialization. It has a read )
( side and a write side. )
( HOST first checks for Xecom board and aborts FORTH if it's not present )
( HOST reassigns the function keys then gets the 1st byte of the screen )
( memory, inverts it, stores it back, reads it again, and compares it to )
( the original value. If it is the same, the SCRS variable remains B000 )
( which is the monochrome display segment. If it is different, then SCRS )
( is changed to B800, the color display segment. The CRT STATUS port or )
( CRTSTAT may also be changed to 3DA which is correct for the color card. )
( Then the STATUS variable is turned ON. And lastly, for initialization, )
( the variable FHNDL, which is the value of the XE12xx's file handle, is )
( checked. If it's 0, then XE1, which is the name given the XE12xx device, )
( is opened for reading and writing. Then the variable INTERP is zeroed )
( to indicate that you are not in the interpreter and ST1 is called to )
( place the correct status line at the top of the screen. Then the main )
( loop of HOST read/write begins. )
: HOST COM0 COMPTR ! KEYZ B000 0 @L -1 XOR DUP B000 0 !L B000 0 @L -
IF 3DA CRTSTAT ! B800 SCRS !
ELSE 3BA CRTSTAT ! B000 SCRS !
THEN
CR STATUS ON
FHNDL @ IF ELSE XO CT@ FF = IF ." "
BLINK ." XECOM BOARD MISSING " NORM S_F2 THEN THEN
0 INTERP ! ST1
VOC @ ( Read the voice dictionary if not already in. )
IF ." Reading '" VDFN ZTYPE ." '" CR 0 VOC !
VDFN 0 FOPEN IOCHK
DUP VSEG 0 VLOC @ 3F00 VCALL VLOC @ - ABORT" Read Error!"
." Read Complete." CR
THEN
( HOST EMULATOR READ SIDE )
BEGIN STATUS @ IF ST THEN ( each loop updates status line )
BEGIN CT@ DUP STS ! DUP C0 AND 40 = IF CLOSS THEN ( lost carrier )
DUP RR AND ( as long as receiver ready, receive )
WHILE DA@ OVER DSR AND ( if there is data to be read ... )
IF ECHOFLAG @ IF DUP XPUT THEN
CHARR @ ( it is output to the screen in its ... )
IF ECHAR ( correct format )
ELSE HEXR @
IF E2HD
ELSE DECR @
IF PUTD
ELSE PUTC
THEN
THEN
THEN
ELSE 7000 + CIO COM0 COMPTR ! ( if DSR was off then the data ... )
THEN DROP ( is an information byte returning, so COMPTR )
REPEAT ( is given a ptr to 0. )
DUP XR AND
IF 5020 ( If XR is off a funny blank char ... )
ELSE 7020 ( if XR is on a reverse video blank ... )
THEN IO"XR ! DROP ( is put at the end of the status line. )
( Then the status byte is dropped and HOST write side begins. )
( HOST EMULATOR WRITE SIDE )
?TERM ?DUP ( ?TERM gets one character from the terminal )
IF COM0 COMPTR ! ( If a key was hit, 0 the command string ptr )
ELSE COMPTR @ C@ DUP ( If not get the next command character )
IF 1 COMPTR +! ( Update pointer )
DUP 46 = ( Is it F )
IF DROP COMPTR @ C@ 1 COMPTR +! BA + ( Convert to FUNCTION )
ELSE DUP 66 = ( Is it f )
IF DROP COMPTR @ C@ 1 COMPTR +! B0 + ( Convert to function )
ELSE STS @ XR AND
IF ( If ready take any character )
ELSE -1 COMPTR +! DROP 0 ( Back up and leave a zero )
THEN
THEN
THEN
THEN
THEN DUP 3 = ( was it a control/break ? )
IF C_BR
THEN DUP DF > ( was it a function key ? )
IF E0 - 2* CODARAY + @ EXECUTE ( if so, look up routine )
ELSE ?DUP
IF STS @ XR AND ( if there is a char and XR is on ... )
IF CTL C@ RTS AND 0= ( fetch the shadow, if RTS is off... )
IF DUP 0700 + CIO ( put it on the command line )
ELSE HALFDUP @ ( if not, check half duplex )
IF DUP EMIT ( if on, emit character on screen )
THEN
THEN DA! ( finally send datum to data port )
ELSE B0 EMIT DROP ( if transmitter wasn't ready emit B0 )
THEN ( B0 is a fuzzy block character . )
THEN
THEN
AGAIN ;
CTAG
: VDEMO S_F4 congratulations on your xecom modem purchase ;
HEX
: QPATCH ' HOST CFA 1E2F ! ;
: UNQPATCH ' QUERY CFA 1E2F ! ;
ASSEMBLER DEFINITIONS
HEX CD 1A 10MI INT1A
FORTH DEFINITIONS
CODE GETIME AH, # 0000 MOV INT1A DX PUSH CX PUSH NEXT JMP END-CODE
CODE SETIME AH, # 0001 MOV INT1A DX, # 0000 MOV CX, # 0000 MOV
INT1A NEXT JMP END-CODE
CREATE CHR 0 , CREATE ERC 0 , CREATE CHRS 0 , ( CHARS SENT )
CREATE THOWS 0 , CREATE MINUTES 0 ,
CREATE TIMHI 0 , CREATE TIMLO 0 ,
CREATE TCNTR 0 ,
: TIMCMP -1 TCNTR +! TCNTR @ 0= IF 64 TCNTR ! TIMLO @ TIMHI @
GETIME D- DABS 4.44 D>
IF 1 MINUTES +! CR
DI MINUTES @ . ." MINUTE(S) " THOWS @ 3E8 M* CHRS @ 0 D+
D. ." CHARACTERS SENT "
ERC @ . ." ERRORS " CR HEX GETIME TIMHI ! TIMLO ! THEN THEN ;
: CHRADJ 1 CHR +! CHR @ 7B = IF 2C CHR ! THEN ;
: RGT1 CT@ RR AND IF DA@ TIMCMP CHRADJ DUP CHR @ = NOT IF 1 ERC +! DUP EMIT CHR @ EMIT BL EMIT THEN CHR ! THEN ;
: XWT1 BEGIN ?KEY RGT1 CT@ XR AND UNTIL ;
: XPT1 XWT1 DA! 1 CHRS +! CHRS @ 3E8 = IF 0 CHRS ! 1 THOWS +! THEN ;
: CSX1 7B 2C DO I XPT1 LOOP ;
: CSET1 GETIME TIMHI ! TIMLO ! 1B XPT1 2A XPT1 64 TCNTR ! 2B CHR ! 0 MINUTES ! 0 CHRS ! 0 THOWS !
0 ERC ! 0 BEGIN CSX1 ?TERM UNTIL ;
CREATE DDOC 0 , 0 ,
CREATE WDOC 0 , 0 ,
: PLANT -FIND IF DROP D@ WDOC D! ELSE ." OOPS " THEN ;
: DOC OVER + WDOC @ SWAP - DDOC ! WDOC 2+ @ + DDOC 2+ ! DDOC SAY ;
: SDOC CREATE DDOC @ , DDOC 2+ @ , DOES> 'SAY @ EXECUTE ;